from fastapi import FastAPI,Cookie,Header
from pydantic import BaseModel
from typing import Annotated

app = FastAPI()

'''显式声明header参数

大部分标准请求头用连字符分隔，即减号（-）。
但是 user-agent 这样的变量在 Python 中是无效的。
因此，默认情况下，Header 把参数名中的字符由下划线（_）改为连字符（-）来提取并存档请求头 。
同时，HTTP 的请求头不区分大小写，可以使用 Python 标准样式（即 snake_case）进行声明。
因此，可以像在 Python 代码中一样使用 user_agent ，无需把首字母大写为 User_Agent 等形式。
如需禁用下划线自动转换为连字符，可以把 Header 的 convert_underscores 参数设置为 False：
'''
@app.get("/items1/")
async def read_items(user_agent: Annotated[str | None, Header(convert_underscores=True)] = None):
    return {"User-Agent": user_agent}
'''注意，使用 convert_underscores = False 要慎重，有些 HTTP 代理和服务器不支持使用带有下划线的请求头。'''


@app.get("/items2/")
# Path,Query,Body,Cookie,Header这些代表的是参数是声明类型
async def read_items(x_token: Annotated[list[str] | None, Header()] = None):
    return {"X-Token values": x_token}
"""
与路径操作通信时，以下面的方式发送两个 HTTP 请求头：
X-Token: foo
X-Token: bar
响应结果是：{
    "X-Token values": [
        "bar",
        "foo"
    ]
}
"""
class CommonHeaders(BaseModel):
    model_config = {"extra": "forbid"}
    host: str
    save_data: bool
    if_modified_since: str | None = None
    traceparent: str | None = None
    x_tag: list[str] = []


@app.get("/items3/")
async def read_items(headers: Annotated[CommonHeaders, Header()]):
    return headers